{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tensorflow实现Mnist手写数字识别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "没有明显报错的正常的log输出，log中的模型准确率达到98%-60分<br/>\n",
    "如何修改隐层数量，修改后会起到什么样的效果-10分<br/>\n",
    "如何修改神经元个数，起到了什么样的效果-10分<br/>\n",
    "如何在模型中添加L1/L2正则化，正则化起什么作⽤-10分<br/>\n",
    "使⽤不同的初始化⽅式对模型有什么影响-10分"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.调试程序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "# 将TensorFlow日志信息输出到屏幕\n",
    "# TensorFlow有五个不同级别的日志信息，分别为调试DEBUG<信息INFO<警告WARN<错误ERROR<致命FATAL\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "导入Mnist数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-0989bc1c3686>:2: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/train-labels-idx1-ubyte.gz\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/t10k-images-idx3-ubyte.gz\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "#########################################\n",
      "Train_data_images_shape: (55000, 784)\n",
      "Train_data_labels_shape: (55000,)\n",
      "#########################################\n",
      "Validation_data_images_shape: (5000, 784)\n",
      "Validation_data_labels_shape: (5000,)\n",
      "#########################################\n",
      "Test_data_images_shape: (10000, 784)\n",
      "Test_data_labels_shape: (10000,)\n",
      "#########################################\n"
     ]
    }
   ],
   "source": [
    "filename = '/home/silence/DeepLearning_Dataset/MNIST_datasets'\n",
    "mnist = input_data.read_data_sets(filename)\n",
    "\n",
    "print('#'*41)\n",
    "print('Train_data_images_shape:',mnist.train.images.shape)\n",
    "print('Train_data_labels_shape:',mnist.train.labels.shape)\n",
    "\n",
    "print('#'*41)\n",
    "print('Validation_data_images_shape:',mnist.validation.images.shape)\n",
    "print('Validation_data_labels_shape:',mnist.validation.labels.shape)\n",
    "\n",
    "print('#'*41)\n",
    "print('Test_data_images_shape:',mnist.test.images.shape)\n",
    "print('Test_data_labels_shape:',mnist.test.labels.shape)\n",
    "print('#'*41)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<font face=\"黑体\"> 显示训练集的一些图片 </font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于image和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，第一个维度留空，待后面batchsize确定。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "\n",
    "learning_rate = tf.Variable(0.001,dtype= tf.float32)\n",
    "#learning_rate = tf.placeholder(\"float\")\n",
    "\n",
    "# 输入层784个神经元，第一隐层500个神经元\n",
    "L1_units_count = 500\n",
    "W_1 = tf.Variable(tf.truncated_normal([784,L1_units_count],stddev = 0.1))\n",
    "b_1 = tf.Variable(tf.truncated_normal([L1_units_count],stddev = 0.1))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "# 第二隐层500个神经元\n",
    "L2_units_count = 500\n",
    "W_2 = tf.Variable(tf.truncated_normal([L1_units_count,L2_units_count],stddev = 0.1))\n",
    "b_2 = tf.Variable(tf.truncated_normal([L2_units_count],stddev = 0.1))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2\n",
    "output_2 = tf.nn.relu(logits_2)\n",
    "\n",
    "# 输出层10个神经元（对应0-9十个数字）\n",
    "L3_units_count = 10 \n",
    "W_3 = tf.Variable(tf.truncated_normal([L2_units_count,L3_units_count],stddev = 0.1))\n",
    "b_3 = tf.Variable(tf.truncated_normal([L3_units_count],stddev = 0.1))\n",
    "logits_3 = tf.matmul(output_2, W_3) + b_3  \n",
    "\n",
    "# 预测输出做一下softmax，形成概率分布。\n",
    "pred = tf.nn.softmax(logits_3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义损失函数和优化函数。损失函数计算使用了sparse_softmax_cross_entropy_with_logits，这样labels可以不用手动做one_hot<br/>\n",
    "这里使用了sgd和Adam优化器，学习率为可以根据需要设定"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义正则参数\n",
    "#regularizer = tf.contrib.layers.l2_regularizer(0.01)\n",
    "#retularization = regularizer(W_1) + regularizer(W_2) + regularizer(W_3)\n",
    "\n",
    "# 定义交叉熵\n",
    "cross_entropy_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=y))\n",
    "\n",
    "# 选择优化函数\n",
    "optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)\n",
    "#optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 2500\n",
    "# saver用来保存或恢复训练的模型\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After 1 training steps, Validation accuracy : 0.9718, Learning_rate : 0.001\n",
      "After 2 training steps, Validation accuracy : 0.9752, Learning_rate : 0.00095\n",
      "After 3 training steps, Validation accuracy : 0.9718, Learning_rate : 0.0009025\n",
      "After 4 training steps, Validation accuracy : 0.9788, Learning_rate : 0.000857375\n",
      "After 5 training steps, Validation accuracy : 0.9768, Learning_rate : 0.00081450626\n",
      "After 6 training steps, Validation accuracy : 0.9796, Learning_rate : 0.0007737809\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/python/training/saver.py:963: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "After 7 training steps, Validation accuracy : 0.9786, Learning_rate : 0.0007350919\n",
      "After 8 training steps, Validation accuracy : 0.9784, Learning_rate : 0.0006983373\n",
      "After 9 training steps, Validation accuracy : 0.9798, Learning_rate : 0.0006634204\n",
      "After 10 training steps, Validation accuracy : 0.9818, Learning_rate : 0.0006302494\n",
      "After 11 training steps, Validation accuracy : 0.9818, Learning_rate : 0.0005987369\n",
      "After 12 training steps, Validation accuracy : 0.9828, Learning_rate : 0.0005688001\n",
      "After 13 training steps, Validation accuracy : 0.9812, Learning_rate : 0.0005403601\n",
      "After 14 training steps, Validation accuracy : 0.9814, Learning_rate : 0.0005133421\n",
      "After 15 training steps, Validation accuracy : 0.9836, Learning_rate : 0.000487675\n",
      "After 16 training steps, Validation accuracy : 0.982, Learning_rate : 0.00046329122\n",
      "After 17 training steps, Validation accuracy : 0.9842, Learning_rate : 0.00044012666\n",
      "After 18 training steps, Validation accuracy : 0.984, Learning_rate : 0.00041812033\n",
      "After 19 training steps, Validation accuracy : 0.9838, Learning_rate : 0.00039721432\n",
      "After 20 training steps, Validation accuracy : 0.9844, Learning_rate : 0.0003773536\n",
      "After 21 training steps, Validation accuracy : 0.9838, Learning_rate : 0.00035848594\n",
      "After 22 training steps, Validation accuracy : 0.9868, Learning_rate : 0.00034056162\n",
      "After 23 training steps, Validation accuracy : 0.9852, Learning_rate : 0.00032353355\n",
      "After 24 training steps, Validation accuracy : 0.9844, Learning_rate : 0.00030735688\n",
      "After 25 training steps, Validation accuracy : 0.985, Learning_rate : 0.000291989\n",
      "After 26 training steps, Validation accuracy : 0.9834, Learning_rate : 0.00027738957\n",
      "After 27 training steps, Validation accuracy : 0.986, Learning_rate : 0.0002635201\n",
      "After 28 training steps, Validation accuracy : 0.986, Learning_rate : 0.00025034408\n",
      "After 29 training steps, Validation accuracy : 0.9856, Learning_rate : 0.00023782688\n",
      "After 30 training steps, Validation accuracy : 0.9842, Learning_rate : 0.00022593554\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9838\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {x: mnist.validation.images, y: mnist.validation.labels,}\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "    \n",
    "    for epoch in range(30):\n",
    "        #每迭代一个周期,重新给学习率赋值，目的：在后期收敛时，防止学习率过大，因此降低学习率，使得loss达到最小\n",
    "        sess.run(tf.assign(learning_rate,0.001*(0.95**epoch)))\n",
    "\n",
    "        for i in range(trainig_step):\n",
    "            xs, ys = mnist.train.next_batch(batch_size)\n",
    "            _, loss = sess.run(\n",
    "                [optimizer, cross_entropy_loss],\n",
    "                feed_dict={\n",
    "                    x: xs,\n",
    "                    y: ys,\n",
    "                    #keep_prob:1.0\n",
    "                    #learning_rate: 0.0001\n",
    "                })\n",
    "            \n",
    "        lr = sess.run(learning_rate)\n",
    "        validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "        print(\"After %d training steps, Validation accuracy : %g, Learning_rate : %s\"\n",
    "              % (epoch+1, validate_accuracy, str(lr)))\n",
    "        saver.save(sess, './model.ckpt', global_step=epoch)\n",
    "        \n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-29\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.作业回答"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.没有明显报错的正常的log输出，log中的模型准确率达到98%<br/>\n",
    "&ensp;从以上输出结果可以看出，输出的log没有明显报错，测试集准确率为98.38%"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.如何修改隐层数量，修改后会起到什么样的效果<br/>\n",
    "&ensp;修改隐层数量见In [4]，修改后模型变复杂，增加一到二个隐层，准确率有所提高，再增加则准确率变化不大"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.如何修改神经元个数，起到了什么样的效果<br/>\n",
    "&ensp;修改神经元个数见In [4]，增加后准确率有所提高，再增加则准确率变化不大"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4.如何在模型中添加L1/L2正则化，正则化起什么作⽤<br/>\n",
    "&ensp;添加正则化见In [5]，本例中并没有用正则化，因为添加后效果并不好。<br/>\n",
    "&ensp;正则化可提高模型的泛化能力，防止过拟合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5.使⽤不同的初始化⽅式对模型有什么影响<br/>\n",
    "&ensp;如果该函数中的初始化函数 tf.truncated_normal(shape, stddev=0.1) 不设置参数 stddev 的话，准确率很差，只有38.01%<br/>\n",
    "&ensp;即使使用不同的优化器或者增加隐层数量，准确率都不会提高，参数 stddev 用于设置正太分布被截断前的标准差，设置了 <br/>\n",
    "&ensp;stddev=0.01 后，准确率就能达到 98% 以上"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
